package expression;

import util.Result;
import util.Scope;
import util.Selector;
import exception.ExpressionException;

/**
 * Klasa odpowiedzialna za przetrzymywanie wyrazenia jednego z:
 * Literal - stala
 * Identyfikator - indentyfikator zmiennej lub wywolanie metody wraz z ciagiem selektorow
 * @see Selector
 * Creator - wywolanie konstruktora klasy
 * Expression - kolejne wyrazenie w nawiasach
 * 
 * @author Jakub Fibinger
 *
 */
public class PrimaryExpression extends Expression {

	/**
	 * Zmienna okreslajaca rodzaj przetrzymywanego wyrazenie 
	 */
	PrimaryType primaryType;
	/**
	 * Przetrzymywane wyrazenie
	 */
	Expression expression;

	public static enum PrimaryType {
		expression, literal, symbol, creator
	}

	public PrimaryExpression() {

	}

	/**
	 * @param scope Zakres zmiennych
	 */
	public PrimaryExpression(Scope scope) {
		this.scope = scope;
	}

	/**
	 * @param scope Zakres zmiennych
	 * @param expression Przetrzymywane wyrazenie
	 * @param primaryType Typ wyrazenia
	 * @throws ExpressionException
	 */
	public PrimaryExpression(Scope scope, Expression expression,
			PrimaryType primaryType) throws ExpressionException {
		if (expression == null) {
			throw new ExpressionException();
		}
		this.scope =scope;
		this.expression = expression;
		this.primaryType = primaryType;
		result = new Result(expression.getResultType(), null);
	}

	/* (non-Javadoc)
	 * @see expression.Expression#evaluate()
	 */
	@Override
	public Result evaluate() throws ExpressionException {
		return expression.evaluate();
	}
	
	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	public String toString(){
		return "PrimaryExpression [ " + expression + "]";
	}

}
